range: add positional style classes to fill/highlight
authorCosimo Cecchi <cosimoc@gnome.org>
Fri, 4 Mar 2016 19:56:08 +0000 (11:56 -0800)
committerCosimo Cecchi <cosimoc@gnome.org>
Fri, 4 Mar 2016 19:57:31 +0000 (11:57 -0800)
Requested by Lapo.

gtk/gtkrange.c

index 9953be80fccf8d9b72c6c9e6e54c5a809cacc0c1..0bedf35e76c259187fc60433f30378ed48d4ead7 100644 (file)
@@ -278,6 +278,8 @@ static gboolean      gtk_range_key_press                (GtkWidget     *range,
                                                         GdkEventKey   *event);
 static void          gtk_range_state_flags_changed      (GtkWidget     *widget,
                                                          GtkStateFlags  previous_state);
+static void          gtk_range_direction_changed        (GtkWidget     *widget,
+                                                         GtkTextDirection  previous_direction);
 static void          gtk_range_measure_trough           (GtkCssGadget   *gadget,
                                                          GtkOrientation  orientation,
                                                          gint            for_size,
@@ -352,6 +354,7 @@ gtk_range_class_init (GtkRangeClass *class)
   widget_class->scroll_event = gtk_range_scroll_event;
   widget_class->key_press_event = gtk_range_key_press;
   widget_class->state_flags_changed = gtk_range_state_flags_changed;
+  widget_class->direction_changed = gtk_range_direction_changed;
 
   class->move_slider = gtk_range_move_slider;
   class->change_value = gtk_range_real_change_value;
@@ -961,6 +964,60 @@ gtk_range_set_adjustment (GtkRange      *range,
     }
 }
 
+static gboolean
+should_invert (GtkRange *range)
+{
+  GtkRangePrivate *priv = range->priv;
+
+  if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
+    return
+      (priv->inverted && !priv->flippable) ||
+      (priv->inverted && priv->flippable && gtk_widget_get_direction (GTK_WIDGET (range)) == GTK_TEXT_DIR_LTR) ||
+      (!priv->inverted && priv->flippable && gtk_widget_get_direction (GTK_WIDGET (range)) == GTK_TEXT_DIR_RTL);
+  else
+    return priv->inverted;
+}
+
+static void
+update_highlight_position (GtkRange *range)
+{
+  GtkRangePrivate *priv = range->priv;
+
+  if (!priv->highlight_gadget)
+    return;
+
+  if (should_invert (range))
+    {
+      gtk_css_gadget_remove_class (priv->highlight_gadget, GTK_STYLE_CLASS_TOP);
+      gtk_css_gadget_add_class (priv->highlight_gadget, GTK_STYLE_CLASS_BOTTOM);
+    }
+  else
+    {
+      gtk_css_gadget_remove_class (priv->highlight_gadget, GTK_STYLE_CLASS_BOTTOM);
+      gtk_css_gadget_add_class (priv->highlight_gadget, GTK_STYLE_CLASS_TOP);
+    }
+}
+
+static void
+update_fill_position (GtkRange *range)
+{
+  GtkRangePrivate *priv = range->priv;
+
+  if (!priv->fill_gadget)
+    return;
+
+  if (should_invert (range))
+    {
+      gtk_css_gadget_remove_class (priv->fill_gadget, GTK_STYLE_CLASS_TOP);
+      gtk_css_gadget_add_class (priv->fill_gadget, GTK_STYLE_CLASS_BOTTOM);
+    }
+  else
+    {
+      gtk_css_gadget_remove_class (priv->fill_gadget, GTK_STYLE_CLASS_BOTTOM);
+      gtk_css_gadget_add_class (priv->fill_gadget, GTK_STYLE_CLASS_TOP);
+    }
+}
+
 static void
 update_stepper_state (GtkRange     *range,
                       Stepper       stepper,
@@ -1039,6 +1096,9 @@ gtk_range_set_inverted (GtkRange *range,
       priv->inverted = setting;
 
       update_steppers_state (range);
+      update_fill_position (range);
+      update_highlight_position (range);
+
       gtk_widget_queue_resize (GTK_WIDGET (range));
 
       g_object_notify_by_pspec (G_OBJECT (range), properties[PROP_INVERTED]);
@@ -1088,6 +1148,8 @@ gtk_range_set_flippable (GtkRange *range,
   if (flippable != priv->flippable)
     {
       priv->flippable = flippable;
+      update_fill_position (range);
+      update_highlight_position (range);
 
       gtk_widget_queue_allocate (GTK_WIDGET (range));
     }
@@ -1565,6 +1627,8 @@ gtk_range_set_show_fill_level (GtkRange *range,
                                                      NULL, NULL);
       gtk_css_gadget_set_state (priv->fill_gadget,
                                 gtk_css_node_get_state (gtk_css_gadget_get_node (priv->trough_gadget)));
+
+      update_fill_position (range);
     }
   else
     {
@@ -1710,20 +1774,6 @@ gtk_range_get_fill_level (GtkRange *range)
   return range->priv->fill_level;
 }
 
-static gboolean
-should_invert (GtkRange *range)
-{
-  GtkRangePrivate *priv = range->priv;
-
-  if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
-    return
-      (priv->inverted && !priv->flippable) ||
-      (priv->inverted && priv->flippable && gtk_widget_get_direction (GTK_WIDGET (range)) == GTK_TEXT_DIR_LTR) ||
-      (!priv->inverted && priv->flippable && gtk_widget_get_direction (GTK_WIDGET (range)) == GTK_TEXT_DIR_RTL);
-  else
-    return priv->inverted;
-}
-
 static void
 gtk_range_destroy (GtkWidget *widget)
 {
@@ -2264,6 +2314,18 @@ update_trough_state (GtkRange *range)
     gtk_css_gadget_set_state (priv->fill_gadget, state);
 }
 
+static void
+gtk_range_direction_changed (GtkWidget        *widget,
+                             GtkTextDirection  previous_direction)
+{
+  GtkRange *range = GTK_RANGE (widget);
+
+  update_fill_position (range);
+  update_highlight_position (range);
+
+  GTK_WIDGET_CLASS (gtk_range_parent_class)->direction_changed (widget, previous_direction);
+}
+
 static void
 gtk_range_state_flags_changed (GtkWidget     *widget,
                                GtkStateFlags  previous_state)
@@ -3805,6 +3867,8 @@ _gtk_range_set_has_origin (GtkRange *range,
                                                           NULL, NULL);
       gtk_css_gadget_set_state (priv->highlight_gadget,
                                 gtk_css_node_get_state (gtk_css_gadget_get_node (priv->trough_gadget)));
+
+      update_highlight_position (range);
     }
   else
     {